package com.ittao.taoaicodecommon.manage.storage.lifecycle.observer;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor;

/**
 * 会话活动主题
 * 实现观察者模式的主题，负责管理观察者并通知事件
 */
@Slf4j
@Component
public class SessionActivitySubject {
    
    /**
     * 观察者列表（线程安全）
     */
    private final CopyOnWriteArrayList<SessionActivityObserver> observers = new CopyOnWriteArrayList<>();
    
    /**
     * 异步执行器
     */
    private final Executor asyncExecutor;
    
    public SessionActivitySubject(Executor virtualThreadExecutor) {
        this.asyncExecutor = virtualThreadExecutor;
    }
    
    /**
     * 添加观察者
     * 
     * @param observer 观察者
     */
    public void addObserver(SessionActivityObserver observer) {
        if (observer != null && !observers.contains(observer)) {
            observers.add(observer);
            log.info("添加会话活动观察者: {}", observer.getObserverName());
        }
    }

    /**
     * 通知所有观察者（异步）
     * 
     * @param event 会话活动事件
     */
    public void notifyObservers(SessionActivityEvent event) {
        if (event == null) {
            return;
        }
        
        log.debug("通知会话活动事件: sessionId={}, activityType={}, eventTime={}", 
                event.getSessionId(), event.getActivityType(), event.getEventTime());
        
        // 异步通知所有观察者
        for (SessionActivityObserver observer : observers) {
            asyncExecutor.execute(() -> {
                try {
                    observer.onSessionActivity(event);
                } catch (Exception e) {
                    log.error("观察者处理会话活动事件失败: observer={}, sessionId={}, error={}", 
                            observer.getObserverName(), event.getSessionId(), e.getMessage(), e);
                }
            });
        }
    }

}